package com.baoming.web.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.baoming.container.ServiceContainer;
import com.baoming.domain.Properties;
import com.baoming.domain.Singup;
import com.baoming.service.IPropertiesService;
import com.baoming.service.ISingupService;
import com.baoming.tool.StringArrayTool; 
import com.baoming.web.form.PropertyForm;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class PropertiesAction extends BaseAction implements ModelDriven<Properties> {

	private IPropertiesService propService = (IPropertiesService) ServiceContainer.getService(IPropertiesService.SERVICE) ; 
	private ISingupService singService = (ISingupService) ServiceContainer.getService(ISingupService.SERVICE) ;  
 
	/**
	 * 用户界面值搜索
	 */
	public String optSearch(){
		
		//从页面得到属性的id 
		String propId = prop.getId() ; 
		//从页面得到搜索的关键字 
		String keyword = prop.getKeyword() ; 
		 
		//关键词为空 或者 属性值为空 直接返回
		if(keyword == null || "".equals(keyword) || propId == null){
			return "optSearch" ; 
		}
		
		//得到属性的信息
		Properties prop = propService.selectPropById(propId) ; 
			
		//得到属性的选项值 
		String xmlValue = prop.getXmlValue() ; 
		
		//值数组化
		String values[] = StringArrayTool.array(xmlValue) ; 
		
		//装查询出的值的集合
		List<PropertyForm> valueList = new ArrayList<PropertyForm>() ; 
		
		//查询出值
		for(String str : values){
			//包含有关键字 装入集合
			if(str.contains(keyword)){
				PropertyForm pf = new PropertyForm() ; 
				pf.setName(prop.getName()) ; 
				pf.setVal(str) ; 
				valueList.add(pf) ; 
			}
		}
		
		//将值传入页面中
		request.setAttribute("valueList", valueList) ; 
		  
		return "optSearch" ; 
	}
	
	/**
	 * 添加属性的值 
	 * @return
	 */
	public String valueEdit(){
		
		//得到属性的id 和 名字 
		String propId = request.getParameter("id") ; 
		 
		//为空则直接返回
		if(propId == null){
			return "valueEdit" ; 
		}
		
		//得到报名的信息
		Properties p = propService.selectPropById(propId) ; 
		//得到比赛的信息
		Singup sing = singService.selectSingUpById(p.getSingupId()) ; 
		//传输到界面
		request.setAttribute("sing", sing) ; 
		 
		//得到属性的信息
		Properties prop = propService.selectPropById(propId) ; 
		request.setAttribute("prop", prop) ; 
		
		//查询出属性值  
		 
		return "valueEdit" ; 
	}
	
	/**
	 * 得到属性值 
	 */ 
	@Override
	public String add() {
		// TODO Auto-generated method stub
		
		//如果得到比赛的ID为空 则返回
		if(prop.getSingupId() == null || prop.getSingupId().equals("")){
			return "addError" ; 
		} 
		String singupId = prop.getSingupId() ; 
		
		//用于装属性集合
		List<Properties> ps = new ArrayList<Properties>() ; 
		
		//得到所有的属性
		List<Properties> properties = propService.listProperties() ; 
		
		//得到页面选取的属性值 
		ps = getPageValue(properties,singupId) ; 
		
		//重新设定属性值 
		reSetValue(ps , singupId) ; 
		
		//设定页面设置
		request.getSession().setAttribute("opt", "success") ; 
		 
		return "add" ;
	}
	
	//得到页面选取的属性值 
	private List<Properties> getPageValue(List<Properties> properties, String singupId) {
		List<Properties> ps = new ArrayList<Properties>() ; 
		// TODO Auto-generated method stub
		for(Properties p : properties){ 
			
			//得到属性值
			String requestValue = request.getParameter(p.getName()) ; 
			
			//用户选择的值 
			if(requestValue != null){
				
				Properties needProp = new Properties() ; 
				needProp.setSingupId(singupId); 
				needProp.setName(requestValue) ; 
				needProp.setValue(p.getValue()) ; 
				 
				//查询属性是必须的
				String requestValueRequest = request.getParameter(p.getName()+"_request") ; 
				needProp.setRequested(Integer.parseInt(requestValueRequest)) ; 
				
				//得到属性的别名
				String alias = request.getParameter(p.getName() +"_alias");  
				needProp.setAlias(alias) ;  
				
				//得到属性长度
				String sizeStr = request.getParameter(p.getName()+"_size");
				if(sizeStr == null||"".equals(sizeStr)){
					needProp.setSize(7) ; 
				}else{
					needProp.setSize(Integer.parseInt(sizeStr)) ; 
				}
				
				//设置属性的类型
				String type = request.getParameter(p.getName()+"_type") ; 
				needProp.setType(type) ; 
				
				//装入集合
				ps.add(needProp) ; 
			}
		}
		return ps ; 
	}

	//重新设定属性值 
	private void reSetValue(List<Properties> ps , String singupId){
		//如果存在有属性
		if(ps.size()>0){
			//先查询出所有这个报名的属性值 
			List<Properties> oldProps = propService.getPropertiesBySingupId(singupId) ;
			//将集合的属性值 装入Map
			Map<String,String> valueMap = new HashMap<String , String>() ; 
			for(Properties p : oldProps){
				//如果存在属性值 
				if(p.getXmlValue() != null && !"".equals(p.getXmlValue())){
					valueMap.put(p.getName(), p.getXmlValue())  ; 
				}
			}
			
			//添加进入前 先删除这个比赛的所有报名属性
			propService.deleteProperties(propService.getPropertiesBySingupId(singupId)) ; 
			
			//设定新的属性的值
			for(Properties p : ps){ 
				p.setXmlValue(valueMap.get(p.getName())) ;  
			}
			
			//重新设定报名的属性
			propService.saveProperties(ps) ; 
		}
	}

	/**
	 * 报名属性的修改
	 */
	@Override
	public String edit() {
		// TODO Auto-generated method stub
		String id = request.getParameter("id") ;  
		//得到比赛的属性
		List<Properties> singupProp = propService.getPropertiesBySingupId(id) ; 
		String sigupPropStr = "" ; 
		//得到属性的字符串
		for(Properties p : singupProp){
			sigupPropStr += p.getName()+"," ; 
		}
		//得到所有的属性值 
		List<Properties> allProps = propService.listProperties() ; 
		//选取出不属于这个比赛的属性值
		List<Properties> resultProps = new ArrayList<Properties>() ; 
		for(Properties p : allProps){
			//如果不包含相同名称字符，则不属于
			if(!sigupPropStr.contains(p.getName())){
				resultProps.add(p) ; 
			}
		}
		//插入比赛的属性集到第一个位置 
		resultProps.addAll(0, singupProp) ; 
		//传值到界面
		request.setAttribute("props", resultProps) ; 
		return "edit" ;
	}

	@Override
	public String manager() {
		// TODO Auto-generated method stub
		
		return null;
	}

	@Override
	public String remove() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String removeGroup() {
		// TODO Auto-generated method stub
		return null;
	}

	private Properties prop = new Properties() ; 
	
	public Properties getModel() {
		// TODO Auto-generated method stub
		return prop ;
	}

}
